package com.moody.calculator;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.moody.hibernate.domain.ReportData;

public class FinanFinancialIndexCalculator {
	private static final Logger log = LoggerFactory.getLogger(FinancialIndexCalculator.class);

	private Map<String,Double> currentMap = new HashMap<String,Double>();     //今年
	private Map<String,Double> lastMap = new HashMap<String,Double>();		//去年
	private Map<String,Double> resultMap = new LinkedHashMap<String,Double>();
	private List<ReportData> reportDataList1;
	private List<ReportData> reportDataList2;
	
	
	public FinanFinancialIndexCalculator(List<ReportData> reportDataList1, List<ReportData> reportDataList2){
		this.reportDataList1 = reportDataList1;
		this.reportDataList2 = reportDataList2;
	}

	//将数据存入map中，包含所有计算财务指标所需要的数据
	public void loadData(){
		if(reportDataList1!=null){
			for(ReportData  rd : reportDataList1){
				currentMap.put(rd.getReportItemNo(), rd.getItemValue());
			}
		}
		if(reportDataList2!=null){
			for(ReportData rd : reportDataList2){
				lastMap.put(rd.getReportItemNo(), rd.getItemValue());
			}
		}
	}
	
	public void computeIndex(){
		//最好是多线程处理
		FinanFinancialIndexCalculator fic = new FinanFinancialIndexCalculator(reportDataList1,reportDataList2);
		fic.loadData();
		Method[] methods = FinanFinancialIndexCalculator.class.getDeclaredMethods();
		for(Method  method : methods){
			String name = method.getName();
			//抽取所有以calculate的方法，表示是计算公式
			if(name.startsWith("calculate")){
				try {
					//reportData名
					name = name.substring("calculate".length(), name.length());
					resultMap.put(name, (Double) method.invoke(fic));
				} catch (Exception e) {
					log.error("该项计算有误",e);
				} 
			}
		}
	}
	
	public Map<String,Double> getResultMap(){
		return resultMap;
	}
	
	/*
	 * 以下为所有的财务指标计算公式
	 */

	//判断double类型是否为0
	public Boolean isZero(Double data){
		if(data >10E-6 || data <-(10E-6))
			return false;
		else
			return true;
	}
	
	//	总资产收益率
	public Double calculateFFR005(){
		//损益表-六、净利润
		Double FIS025 = currentMap.get("FIS025");
		//资产负债表-资产总计（年初）
		Double lastFBS044 = lastMap.get("FBS044");
		//资产负债表-资产总计（年末）
		Double FBS044 = currentMap.get("FBS044");
		if(FIS025 != null && lastFBS044 != null && FBS044 != null && !isZero(lastFBS044 + FBS044)){
			return FIS025 / ((lastFBS044 + FBS044) / 2);
		}
		else{
			log.error("数据项不存在或分母为空");
			return null;
		}
	}
	//	成本收入比
	public Double calculateFFR006(){
		//损益表-二、营业支出
		Double FIS010 = currentMap.get("FIS010");
		//损益表-一、营业收入
		Double FIS001 = currentMap.get("FIS001");
		if(FIS010 != null && FIS001 != null && !isZero(FIS001)){
			return FIS010 / FIS001;
		}
		else{
			log.error("数据项不存在或分母为空");
			return null;
		}
	}
	//	净资产收益率
	public Double calculateFFR007(){
		//损益表-六、净利润（年初）
		Double lastFIS025 = lastMap.get("FIS025");
		//资产负债表-资产总计（年末）
		Double FBS044 = currentMap.get("FBS044");
		//资产负债表-负债合计（年末）
		Double FBS084 = currentMap.get("FBS084");
		//资产负债表-资产总计（年初）
		Double lastFBS044 = lastMap.get("FBS044");
		//资产负债表-负债合计（年初）
		Double lastFBS084 = lastMap.get("FBS084");
		if(lastFIS025 != null && FBS044 != null && FBS084 != null && lastFBS044!= null && 
				lastFBS084 != null && !isZero((FBS044 - FBS084) + (lastFBS044 - lastFBS084))){
			return lastFIS025 / (((FBS044 - FBS084) + (lastFBS044 - lastFBS084)) / 2);
		}
		else{
			log.error("数据项不存在或分母为空");
			return null;
		}
		
		
	}
	//	净利润
	public Double calculateFFR009(){
		return new Double(0);
	}
	//	存贷比
	public Double calculateFFR014(){
		//资产负债表-短期贷款
		Double FBS012 = currentMap.get("FBS012");
		//资产负债表-中长期贷款
		Double FBS025 = currentMap.get("FBS025");
		//资产负债表-逾期贷款
		Double FBS027 = currentMap.get("FBS027");
		//资产负债表-应收进出口押汇
		Double FBS015 = currentMap.get("FBS015");
		//资产负债表-贴现
		Double FBS019 = currentMap.get("FBS019");
		//资产负债表-流动负债合计
		Double FBS071 = currentMap.get("FBS071");
		//资产负债表-应解汇款
		Double FBS059 = currentMap.get("FBS059");
		//资产负债表-长期存款
		Double FBS074 = currentMap.get("FBS074");
		//资产负债表-长期储蓄存款
		Double FBS075 = currentMap.get("FBS075");
		
		if(FBS012 != null && FBS025 != null && FBS027 != null && FBS015 != null && 
				FBS019 != null && FBS071 != null && FBS059 != null && FBS074 != null && 
				FBS075 != null && !isZero(FBS071 + FBS059 + FBS074 + FBS075)){
			return (FBS012 + FBS025 + FBS027 + FBS015 + FBS019) / 
				(FBS071 + FBS059 + FBS074 + FBS075);
		}
		else{
			log.error("数据项不存在或分母为空");
			return null;
		}
	}
	//	总资产
	public Double calculateFFR017(){
		return new Double(0);
	}
	//	股东权益
	public Double calculateFFR018(){
		return new Double(0);
		
	}
	//	总资产增长率
	public Double calculateFFR020(){
		//资产负债表-资产总计（年末）
		Double FBS044 = currentMap.get("FBS044");
		//资产负债表-资产总计（年初）
		Double lastFBS044 = lastMap.get("FBS044");
		if(FBS044 != null && lastFBS044 != null && !isZero(lastFBS044)){
			return (FBS044 - lastFBS044) / lastFBS044;
		}
		else{
			log.error("数据项不存在或分母为空");
			return null;
		}
	}
	//	内部资本增长率
	public Double calculateFFR021(){
		//资产负债表-所有者权益合计（年末）
		Double FBS092 = currentMap.get("FBS092");
		//资产负债表-所有者权益合计（年初）
		Double lastFBS092 = lastMap.get("FBS092");
		if(FBS092 != null && lastFBS092 != null && !isZero(lastFBS092)){
			return (FBS092 - lastFBS092) / lastFBS092;
		}
		else{
			log.error("数据项不存在或分母为空");
			return null;
		}
	}
}
